//===----------------------------------------------------------------------===//
//
// This source file is part of the Soto for AWS open source project
//
// Copyright (c) 2017-2024 the Soto project authors
// Licensed under Apache License v2.0
//
// See LICENSE.txt for license information
// See CONTRIBUTORS.txt for the list of Soto project authors
//
// SPDX-License-Identifier: Apache-2.0
//
//===----------------------------------------------------------------------===//

// THIS FILE IS AUTOMATICALLY GENERATED by https://github.com/soto-project/soto-codegenerator.
// DO NOT EDIT.

#if canImport(FoundationEssentials)
import FoundationEssentials
#else
import Foundation
#endif
@_exported import SotoCore

/// Service object for interacting with AWS KinesisVideoWebRTCStorage service.
///
/// webrtc
public struct KinesisVideoWebRTCStorage: AWSService {
    // MARK: Member variables

    /// Client used for communication with AWS
    public let client: AWSClient
    /// Service configuration
    public let config: AWSServiceConfig

    // MARK: Initialization

    /// Initialize the KinesisVideoWebRTCStorage client
    /// - parameters:
    ///     - client: AWSClient used to process requests
    ///     - region: Region of server you want to communicate with. This will override the partition parameter.
    ///     - partition: AWS partition where service resides, standard (.aws), china (.awscn), government (.awsusgov).
    ///     - endpoint: Custom endpoint URL to use instead of standard AWS servers
    ///     - middleware: Middleware chain used to edit requests before they are sent and responses before they are decoded 
    ///     - timeout: Timeout value for HTTP requests
    ///     - byteBufferAllocator: Allocator for ByteBuffers
    ///     - options: Service options
    public init(
        client: AWSClient,
        region: SotoCore.Region? = nil,
        partition: AWSPartition = .aws,
        endpoint: String? = nil,
        middleware: AWSMiddlewareProtocol? = nil,
        timeout: TimeAmount? = nil,
        byteBufferAllocator: ByteBufferAllocator = ByteBufferAllocator(),
        options: AWSServiceConfig.Options = []
    ) {
        self.client = client
        self.config = AWSServiceConfig(
            region: region,
            partition: region?.partition ?? partition,
            serviceName: "KinesisVideoWebRTCStorage",
            serviceIdentifier: "kinesisvideo",
            serviceProtocol: .restjson,
            apiVersion: "2018-05-10",
            endpoint: endpoint,
            serviceEndpoints: Self.serviceEndpoints,
            variantEndpoints: Self.variantEndpoints,
            errorType: KinesisVideoWebRTCStorageErrorType.self,
            middleware: middleware,
            timeout: timeout,
            byteBufferAllocator: byteBufferAllocator,
            options: options
        )
    }


    /// custom endpoints for regions
    static var serviceEndpoints: [String: String] {[
        "us-gov-east-1": "kinesisvideo-fips.us-gov-east-1.amazonaws.com",
        "us-gov-west-1": "kinesisvideo-fips.us-gov-west-1.amazonaws.com"
    ]}


    /// FIPS and dualstack endpoints
    static var variantEndpoints: [EndpointVariantType: AWSServiceConfig.EndpointVariant] {[
        [.fips]: .init(endpoints: [
            "us-gov-east-1": "kinesisvideo-fips.us-gov-east-1.amazonaws.com",
            "us-gov-west-1": "kinesisvideo-fips.us-gov-west-1.amazonaws.com"
        ])
    ]}

    // MARK: API Calls

    ///  Before using this API, you must call the GetSignalingChannelEndpoint API to request the WEBRTC endpoint. You then specify the endpoint and region in your JoinStorageSession API request.  Join the ongoing one way-video and/or multi-way audio WebRTC session as a video producing device for an input channel. If there’s no existing session for the channel, a new streaming session needs to be created, and the Amazon Resource Name (ARN) of the signaling channel must be provided.  Currently for the SINGLE_MASTER type, a video producing device is able to ingest both audio and video media into a stream. Only video producing devices can join the session and record media.  Both audio and video tracks are currently required for WebRTC ingestion. Current requirements:   Video track: H.264   Audio track: Opus    The resulting ingested video in the Kinesis video stream will have the following parameters: H.264 video and AAC audio. Once a master participant has negotiated a connection through WebRTC, the ingested media session will be stored in the Kinesis video stream. Multiple viewers are then able to play back real-time media through our Playback APIs. You can also use existing Kinesis Video Streams features like HLS or DASH playback, image generation via GetImages, and more with ingested WebRTC media.  S3 image delivery and notifications are not currently supported.   Assume that only one video producing device client can be associated with a session for the channel. If more than one  client joins the session of a specific channel as a video producing device, the most recent client request takes precedence.    Additional information     Idempotent - This API is not idempotent.    Retry behavior - This is counted as a new API call.    Concurrent calls - Concurrent calls are allowed. An offer is sent once per each call.
    @Sendable
    @inlinable
    public func joinStorageSession(_ input: JoinStorageSessionInput, logger: Logger = AWSClient.loggingDisabled) async throws {
        try await self.client.execute(
            operation: "JoinStorageSession", 
            path: "/joinStorageSession", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    ///  Before using this API, you must call the GetSignalingChannelEndpoint API to request the WEBRTC endpoint. You then specify the endpoint and region in your JoinStorageSession API request.  Join the ongoing one way-video and/or multi-way audio WebRTC session as a video producing device for an input channel. If there’s no existing session for the channel, a new streaming session needs to be created, and the Amazon Resource Name (ARN) of the signaling channel must be provided.  Currently for the SINGLE_MASTER type, a video producing device is able to ingest both audio and video media into a stream. Only video producing devices can join the session and record media.  Both audio and video tracks are currently required for WebRTC ingestion. Current requirements:   Video track: H.264   Audio track: Opus    The resulting ingested video in the Kinesis video stream will have the following parameters: H.264 video and AAC audio. Once a master participant has negotiated a connection through WebRTC, the ingested media session will be stored in the Kinesis video stream. Multiple viewers are then able to play back real-time media through our Playback APIs. You can also use existing Kinesis Video Streams features like HLS or DASH playback, image generation via GetImages, and more with ingested WebRTC media.  S3 image delivery and notifications are not currently supported.   Assume that only one video producing device client can be associated with a session for the channel. If more than one  client joins the session of a specific channel as a video producing device, the most recent client request takes precedence.    Additional information     Idempotent - This API is not idempotent.    Retry behavior - This is counted as a new API call.    Concurrent calls - Concurrent calls are allowed. An offer is sent once per each call.
    ///
    /// Parameters:
    ///   - channelArn:  The Amazon Resource Name (ARN) of the signaling channel.
    ///   - logger: Logger use during operation
    @inlinable
    public func joinStorageSession(
        channelArn: String,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws {
        let input = JoinStorageSessionInput(
            channelArn: channelArn
        )
        return try await self.joinStorageSession(input, logger: logger)
    }

    ///  Join the ongoing one way-video and/or multi-way audio WebRTC session as  a viewer for an input channel. If there’s no existing session for the channel, create a new streaming session and provide the Amazon Resource Name (ARN) of the signaling channel (channelArn) and client id (clientId).  Currently for SINGLE_MASTER type, a video producing device is able to ingest both audio and video media into a stream, while viewers can only ingest audio. Both a video producing device and viewers can join a session first and wait for other participants. While participants are having peer to peer conversations through WebRTC, the ingested media session will be stored into the Kinesis Video Stream. Multiple viewers are able to playback real-time media.  Customers can also use existing Kinesis Video Streams features like HLS or DASH playback, Image generation, and more  with ingested WebRTC media. If there’s an existing session with the same clientId that's found in the join session request, the new request takes precedence.
    @Sendable
    @inlinable
    public func joinStorageSessionAsViewer(_ input: JoinStorageSessionAsViewerInput, logger: Logger = AWSClient.loggingDisabled) async throws {
        try await self.client.execute(
            operation: "JoinStorageSessionAsViewer", 
            path: "/joinStorageSessionAsViewer", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    ///  Join the ongoing one way-video and/or multi-way audio WebRTC session as  a viewer for an input channel. If there’s no existing session for the channel, create a new streaming session and provide the Amazon Resource Name (ARN) of the signaling channel (channelArn) and client id (clientId).  Currently for SINGLE_MASTER type, a video producing device is able to ingest both audio and video media into a stream, while viewers can only ingest audio. Both a video producing device and viewers can join a session first and wait for other participants. While participants are having peer to peer conversations through WebRTC, the ingested media session will be stored into the Kinesis Video Stream. Multiple viewers are able to playback real-time media.  Customers can also use existing Kinesis Video Streams features like HLS or DASH playback, Image generation, and more  with ingested WebRTC media. If there’s an existing session with the same clientId that's found in the join session request, the new request takes precedence.
    ///
    /// Parameters:
    ///   - channelArn:  The Amazon Resource Name (ARN) of the signaling channel.
    ///   - clientId:  The unique identifier for the sender client.
    ///   - logger: Logger use during operation
    @inlinable
    public func joinStorageSessionAsViewer(
        channelArn: String,
        clientId: String,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws {
        let input = JoinStorageSessionAsViewerInput(
            channelArn: channelArn, 
            clientId: clientId
        )
        return try await self.joinStorageSessionAsViewer(input, logger: logger)
    }
}

extension KinesisVideoWebRTCStorage {
    /// Initializer required by `AWSService.with(middlewares:timeout:byteBufferAllocator:options)`. You are not able to use this initializer directly as there are not public
    /// initializers for `AWSServiceConfig.Patch`. Please use `AWSService.with(middlewares:timeout:byteBufferAllocator:options)` instead.
    public init(from: KinesisVideoWebRTCStorage, patch: AWSServiceConfig.Patch) {
        self.client = from.client
        self.config = from.config.with(patch: patch)
    }
}
